package com.bms.client.service.impl;

import com.bms.client.mapper.FeiYongGuanLiMapper;
import com.bms.client.mapper.HeZuoJiHuaGuanLiMapper;
import com.bms.client.mapper.KeYanRenYuanMapper;
import com.bms.client.mapper.LaiFangGuanLiMapper;
import com.bms.client.pojo.LaiFangGuanLi;
import com.bms.client.pojo.LaiFangGuanLiGenXin;
import com.bms.client.pojo.LaiFangGuanLiZhengJia;
import com.bms.client.utils.RedisUtils;
import org.springframework.beans.BeanUtils;
import com.bms.client.service.LaiFangGuanLiService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

/**
 * 来访管理(LaiFangGuanLi)表服务实现类
 *
 * @author makejava
 * @since 2021-03-15 20:23:02
 * @version 1.0
 */
@Service("laiFangGuanLiService")
public class LaiFangGuanLiServiceImpl implements LaiFangGuanLiService {
    @Resource
    private LaiFangGuanLiMapper laiFangGuanLiMapper;
    @Resource
    private HeZuoJiHuaGuanLiMapper heZuoJiHuaGuanLiMapper;
    @Resource
    private FeiYongGuanLiMapper feiYongGuanLiMapper;
    @Resource
    private RedisUtils redisUtils;
    @Resource
    private KeYanRenYuanMapper keYanRenYuanMapper;

    /**
     * 根据模糊条件查询总个数
     *
     * @return 返回查询到的总个数
     */
	@Override
    public Map<String, Object> chaXunCount(String mingCheng) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("list", this.laiFangGuanLiMapper.chaXunCount(mingCheng));
        return map;
    }

    /**
     * 查询所有数据
     * @return  返回所有数据
     */
	@Override
    public Map<String, Object> chaXunAll() {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("list", this.laiFangGuanLiMapper.chaXunAll());
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
	@Override
    public Map<String, Object> chaXunById(Integer id) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("obj", this.laiFangGuanLiMapper.chaXunById(id));
        return map;
    }

    /**
     * 查询分页数据
     *
     * @param page 查询起始位置
     * @param mingCheng 查询条数
     * @return 对象列表
     */
	@Override
    public Map<String, Object> chaXunFenYe(int page, String mingCheng) {
    // 获取当前表中的总记录
        int tableCount = this.laiFangGuanLiMapper.chaXunCount(mingCheng);
        // 总页码计算   (总条数 - 1) / 每页显示条数  + 1
        // (100 - 1) / 10 + 1 = 10        (101 - 1) / 10 + 1 = 11      (99 - 1) / 10 + 1 = 10
        int pageCount = (tableCount - 1) / 10 + 1;
        // 计算每页开始的下标值
        int xiaBiao = (page - 1) * 10;
        Map<String, Object> map = new HashMap<>();
        map.put("code", 0);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "查询成功");
        map.put("pageCount", pageCount);  // 查询的记录总页码
        map.put("count", tableCount);     // 当前表中的总条数
        map.put("data", this.laiFangGuanLiMapper.chaXunFenYe(xiaBiao, mingCheng));
        return map;
    }

    /**
     * 新增数据
     *
     * @param laiFangGuanLiZhengJia 实例对象
     * @return 实例对象
     */
	@Override
    @Transactional(rollbackFor = Throwable.class)
    public Map<String, Object> xinZeng(LaiFangGuanLiZhengJia laiFangGuanLiZhengJia) {
        Map<String, Object> map = new HashMap<>();
        if(heZuoJiHuaGuanLiMapper.chaXunById(laiFangGuanLiZhengJia.getHeZuoJiHuaId())==null){
            map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
            map.put("msg", "没有关联的合作计划,或您输入的信息有误");
            return map;
        }
        LaiFangGuanLi laiFangGuanLi=new LaiFangGuanLi();
        BeanUtils.copyProperties(laiFangGuanLiZhengJia,laiFangGuanLi);
        this.laiFangGuanLiMapper.xinZeng(laiFangGuanLi);

        redis(laiFangGuanLi.getId(),0);

        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "新增成功");
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param laiFangGuanLiGenXin 实例对象
     * @return 实例对象
     */
	@Override
    @Transactional(rollbackFor = Throwable.class)
    public Map<String, Object> gengXinById(LaiFangGuanLiGenXin laiFangGuanLiGenXin) {
        Map<String, Object> map = new HashMap<>();
        LaiFangGuanLi laiFangGuanLi=new LaiFangGuanLi();
        BeanUtils.copyProperties(laiFangGuanLiGenXin,laiFangGuanLi);
        if(keYanRenYuanMapper.chaXunById(laiFangGuanLiGenXin.getGenJinRen())==null){
            map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
            map.put("msg", "没有该科研人员");
            return map;
        }
        this.laiFangGuanLiMapper.gengXinById(laiFangGuanLi);

        redis(laiFangGuanLiGenXin.getId(),1);

        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "更新成功");
        return map;
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
	@Override
    @Transactional(rollbackFor = Throwable.class)
    public Map<String, Object> shanChuById(String id) {
        Map<String, Object> map = new HashMap<>();
        try {
            Integer.parseInt(id);
        } catch (NumberFormatException e) {
            e.printStackTrace();
            map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
            map.put("msg", "请输入纯数字");
            return map;
        }
        if(feiYongGuanLiMapper.chaXunById(laiFangGuanLiMapper.chaXunById(Integer.parseInt(id)).getFeiYong())!=null){
            map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
            map.put("msg", "无法删除一个具有费用的出访记录");
            return map;
        }
        this.laiFangGuanLiMapper.shanChuById(id);

        if(redisUtils.redisDelete("laiFangGuanLi",id)){
            map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
            map.put("msg", "重复删除");
            return map;
        }

        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "删除成功");
        return map;
    }

    @Override
    public String chaXunLaiFangWeiWanCheng() {
	    StringBuilder LaiFangWeiWanCheng= new StringBuilder();
        for(LaiFangGuanLi laiFangGuanLi:laiFangGuanLiMapper.chaXunLaiFangWeiWanCheng()){
            LaiFangWeiWanCheng.append(",").append(laiFangGuanLi.getId());
        }
        return LaiFangWeiWanCheng.toString().replaceFirst(",", "");
    }

    @Override
    public void redis(int id,int stat){
        LaiFangGuanLi laiFangGuanLi = (LaiFangGuanLi)chaXunById(id).get("obj");
        if(laiFangGuanLi!=null){
            Map<String,String>  conditionalQueue=new HashMap<>();
            conditionalQueue.put("keHuMingCheng",laiFangGuanLi.getKeHuMingCheng());
            conditionalQueue.put("gongSiMingCheng",laiFangGuanLi.getGongSiMingCheng());
            if(stat==0){
                redisUtils.redisInsert("laiFangGuanLi",conditionalQueue, String.valueOf(id),laiFangGuanLi);
            }
            if(stat==1){
                redisUtils.redisUpData("laiFangGuanLi",conditionalQueue, String.valueOf(id),laiFangGuanLi);
            }
        }
    }
}